package com.fowo.api.mp.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.Map;

/**
 * 统一服务消息
 */
@Data
public class WxUniformMessage {

    /**
     * 用户openid，可以是小程序的openid，也可以是mp_template_msg.appid对应的公众号的openid
     */
    @JsonProperty("touser")
    private String toUser;

    /**
     * 公众号模板消息相关的信息，可以参考公众号模板消息接口；有此节点并且没有weapp_template_msg节点时，发送公众号模板消息
     */
    private MpTemplateMsg mpTemplateMsg = new MpTemplateMsg();

    @Data
    public static class MpTemplateMsg {

        /**
         * 公众号appid，要求与小程序有绑定且同主体(如果配置了 mini-program.mp-app-id，此值不需要设置，服务发送时会自动设置)
         */
        @JsonProperty("appid")
        private String appId;

        /**
         * 公众号模板id
         */
        private String templateId;

        /**
         * 公众号模板消息所要跳转的url
         */
        private String url;

        /**
         * 公众号模板消息所要跳转的小程序，小程序的必须与公众号具有绑定关系
         */
        @JsonProperty("miniprogram")
        private MpMiniProgram miniProgram = new MpMiniProgram();

        /**
         * 公众号模板消息的数据
         */
        private Map<String, MpTemplateVariable> data;
    }

    @Data
    public static class MpMiniProgram {

        @JsonProperty("appid")
        private String appId;

        @JsonProperty("pagepath")
        private String pagePath = "/pages/index/index";
    }

    @Data
    public static class MpTemplateVariable {
        /**
         * 模版变量值
         */
        private String value;

        /**
         * 模版变量颜色
         */
        private String color = "#000000";
    }

    public WxUniformMessageBuilder builder() {
        return new WxUniformMessageBuilder();
    }

    public static class WxUniformMessageBuilder {
        private final WxUniformMessage message;

        protected WxUniformMessageBuilder() {
            message = new WxUniformMessage();
        }

        public WxUniformMessage build() {
            return message;
        }

        /**
         * 设置发送给用户的 openId
         * @param openId
         */
        public WxUniformMessageBuilder toUser(String openId) {
            message.setToUser(openId);
            return this;
        }

        /**
         * 设置消息模版 id
         * @param templateId 消息模版 id
         */
        public WxUniformMessageBuilder template(String templateId) {
            message.getMpTemplateMsg().setTemplateId(templateId);
            return this;
        }

        /**
         * 添加模版数据设置(黑色)
         * @param name 模版数据名称
         * @param value 模版数据值
         */
        public WxUniformMessageBuilder addData(String name, String value)
        {
            return addData(name, value, "#000000");
        }

        /**
         * 添加模版数据设置
         * @param name 模版数据名称
         * @param value 模版数据值
         * @param color 模版数据颜色
         */
        public WxUniformMessageBuilder addData(String name, String value, String color) {
            MpTemplateVariable templateVariable = new MpTemplateVariable();
            templateVariable.setColor(color);
            templateVariable.setValue(value);
            message.getMpTemplateMsg().getData().put(name, templateVariable);
            return this;
        }

        /**
         * 设置小程序跳转页面路径
         * @param pagePath 小程序页面路径
         */
        public WxUniformMessageBuilder pagePath(String pagePath) {
            message.getMpTemplateMsg().getMiniProgram().setPagePath(pagePath);
            return this;
        }
    }
}
